package com.kevinkk.monotonicstack;

import java.util.*;

/**
 * 给定一个循环数组 nums （ nums[nums.length - 1] 的下一个元素是 nums[0] ），返回 nums 中每个元素的 下一个更大元素 。
 * 数字 x 的 下一个更大的元素 是按数组遍历顺序，这个数字之后的第一个比它更大的数，这意味着你应该循环地搜索它的下一个更大的数。如果不存在，则输出 -1 。
 *
 *
 * 通过将 nums 连续拼在一起，处理循环的问题
 */
public class NextGreaterElementII {
    class Solution {
        public int[] nextGreaterElements(int[] nums) {
            int length = nums.length;
            int[] res = new int[length];
            Arrays.fill(res, -1);
            Deque<Integer> st = new ArrayDeque<>();

            for (int i = 0; i < length * 2; i++) {
                while (!st.isEmpty() && nums[i % length] > nums[st.peekFirst()]) {
                    int index = st.removeFirst();
                    res[index] = nums[i % length];
                }
                st.addFirst(i % length);
            }

            return res;
        }
    }
}
